package letcode.oneQuestionPerDay._202004._08;

import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Set;

/**
 * @Description: 机器人的运动范围
 * @Date: 2020/4/8
 * @Author: 许群星
 */
public class RangeOfRobotMoving_1 {
    public static void main(String[] args) {
        int m = 2, n = 3, k = 1;
        int m1 = 3, n1 = 1, k1 = 0;
        int m2 = 16, n2 = 8, k2 = 4;
        System.out.println(movingCount(m2, n2, k2));
    }

    //提供方法    自己解法：优化
    // 1、只用两个方向就行，不用四个方向  判断条件也减少为不超出就行
    // 2、不用先循环放值，直接走到哪儿放哪儿   利用1000来放值取值
    public static int movingCount(int m, int n, int k) {
        //上下左右四个点
        int[] dx = {0,  1};
        int[] dy = {1,  0};

        if (k == 0)
            return 1;
        //用一个set来放能到达的地方
        Set<Integer> set = new HashSet<>();
        set.add(0);

        //深度优先
        Queue<Integer> queue=new LinkedList<>();
        queue.add(0);
        while (!queue.isEmpty()){
            int haha=queue.poll();
            int i=haha/1000;
            int j=haha%1000;
            for (int l = 0; l < 2; l++) {
                //得到新的x,y坐标
                int x = i + dx[l];
                int y = j + dy[l];
                //边缘条件
                if ( x >= m || y >= n)
                    continue;
                //判断条件  在k的范围之内 加一
                int total = 0;
                if (x >= 9) {
                    total += x / 10;
                    total += x % 10;
                } else
                    total += x;
                if (y >= 9) {
                    total += y / 10;
                    total += y % 10;
                } else
                    total += y;
                if (total <= k) {
                    int temp=x*1000+y;
                    if (!set.contains(temp))
                        queue.add(temp);
                    set.add(temp);
                }
            }
        }
        return set.size();
    }
}
/*
地上有一个m行n列的方格，从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动，
它每次可以向左、右、上、下移动一格（不能移动到方格外），也不能进入行坐标和列坐标的数位之和大于k的格子。
例如，当k为18时，机器人能够进入方格 [35, 37] ，因为3+5+3+7=18。但它不能进入方格 [35, 38]，因为3+5+3+8=19。请问该机器人能够到达多少个格子？
示例 1：
输入：m = 2, n = 3, k = 1
输出：3
示例 1：
输入：m = 3, n = 1, k = 0
输出：1
提示：

1 <= n,m <= 100
0 <= k <= 20

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */